<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // 实例化对象都有原型属性([[Prototype]]) => 指向构造函数(创建该实例化对象构造函数)的原型对象(prototype)

    // 构造函数 => 创建实例化对象
    function Cat(name, color) {
        // {}
        // {}[[Prototype]] = Cat.prototype   {}.__proto__ = Cat.prototype  => 所有的实例化对象都有原型属性([[Prototype]]) => 指向构造函数的原型对象(prototype)   !!!!!!!!
        // this -> {}   强制将this指向创建的实例化对象

        this.name = name;
        this.color = color;

        // return this;
    }

    // protptype(原型对象 => 对象) => 存储所有实例化对象共有的属性和方法  => 供所有的实例化对象访问
    Cat.prototype.species = "Cat";
    Cat.prototype.call = function () {
        console.log("喵喵");
    }
    Cat.prototype.skill = function () {
        console.log("捉老鼠");
    }
    Cat.prototype.say = function () {
        // this指向 => 调用此方法的实例化对象
        console.log(this.name, this.color);
    }

    Object.prototype.a = 1;
    Object.prototype.b = 2;



    // 所有的实例化对象都可以访问 Object.prototype上的属性和方法


    // toString()   将实例化对象转化为字符串
    // valueOf()    返回实例化对象本身

    // console.log(Tom.toString());  // '[object Object]'
    // console.log(Tom.valueOf());   //  Tom

    // hasOwnProperty(key)  传入属性名,判断实例化对象是否存在该属性 (只查找实例化对象本身,不在原型链上查找)
    // isPrototypeOf()   判断某个构造函数的原型对象 => 是否于 某个实例化对象的原型链 上
    // propertyIsEnumerable()  传入属性名,判断实例化对象上该属性是否可以枚举(遍历)   (只查找实例化对象本身,不在原型链上查找)


    var num = new Number(1);
    var str = new String("hello");
    var bool = new Boolean(true);
    var arr = [1, 2, 3];
    var obj = { a: 1, b: 2 };
    var p = new Promise(function () { })
    var Tom = new Cat("Tom", "black");
    // console.log(Tom);

    console.log(num.toString());
    console.log(str.toString());
    console.log(bool.toString());
    console.log(arr.toString());
    console.log(obj.toString());  // "[object Object]"
    console.log(p.toString()); // "[object Promise]"
    console.log(Tom.toString());// "[object Object]"

    console.dir(num);
    // console.dir(arr);
    // console.dir(obj);
    // console.dir(p);








</script>

</html>